package com.customer.service.customer;

import com.customer.mapper.CustomerMapper;
import com.customer.mapper.SmsMapper;
import com.customer.mapper.SmsTemplateMapper;
import com.customer.model.Customer;
import com.customer.model.Sms;
import com.customer.model.SmsTemplate;
import com.customer.util.ResponseData;
import com.customer.util.SMSTemplateConstant;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 2 * @Author: xy
 * 3 * @Date: 2021/10/14 下午 7:22:05
 */
@Service
public class CustomerServiceImpl implements CustomerService {
    //    乘客注册Dao
    @Autowired
    private CustomerMapper customerMapper;
    //    验证码Dao
    @Autowired
    private SmsMapper smsMapper;
    //    验证码模板Dao
    @Autowired
    private SmsTemplateMapper smsTemplateMapper;

    HashMap<String, Object> smsTemplateCache = new HashMap<>();

    //发送短信
    //1.用户录入手机号获取到手机短信验证码，涉及阿里云短信工具类，随机生成6位验证码―将短信验证码保存在缓存中(redis)，设置过期时问
    @Override
    public String smsSending(String phoneNumber) {
        // 生成验证码
        String verificationCode = RandomStringUtils.randomNumeric(6);

        //判断map中是否该短信模板，如果没有就查询数据库存入缓存

        if (!(smsTemplateCache.containsKey(SMSTemplateConstant.REGISTER_TEMPLATE_ID))) {
            SmsTemplate smsTemplate = smsTemplateMapper.selectByTemplateId(SMSTemplateConstant.REGISTER_TEMPLATE_ID);
            smsTemplateCache.put(SMSTemplateConstant.REGISTER_TEMPLATE_ID, smsTemplate);
        }
        //进行短信信息录入
        Sms sms = new Sms();
        sms.setPassengerPhoneNumber(phoneNumber);
        sms.setSmsContent(((SmsTemplate) smsTemplateCache.get(SMSTemplateConstant.REGISTER_TEMPLATE_ID)).getContent());
        sms.setSendTime(new Date());
        try {
            //发送短信
            String templateId = ((SmsTemplate) smsTemplateCache.get(SMSTemplateConstant.REGISTER_TEMPLATE_ID)).getTemplateId();
//            SmsUtil.sendSms(phoneNumber, templateId, verificationCode);
            boolean sendSms = true;
            String content = ((SmsTemplate) smsTemplateCache.get(SMSTemplateConstant.REGISTER_TEMPLATE_ID)).getContent();
            //将模板中的${code}替换成自己生成的验证码
            String replace = StringUtils.replace(content, "${code}", verificationCode);
            sms.setSmsContent(replace);
            //进行短信信息录入(成功)
            sms.setSendFlag(1);
            sms.setSendNumber(0);
            if (sendSms) {
                return verificationCode;
            }
        } catch (RuntimeException e) {
            //进行短信信息录入(失败)
            sms.setSmsContent("");
            sms.setSendFlag(0);
            sms.setSendNumber(1);
        } finally {
            //无论失败存入数据库
            smsMapper.InterSms(sms);
        }
        return "";
    }

    // 缓存验证码
    @Override
    public ResponseData cacheVerificationCode(String phoneNumber, String code) {
        // 判断验证码是否正确
        if (!code.equals("") || code.length() == 6) {
            // 验证通过使用redis进行缓存
            Jedis jedis = new Jedis("localhost", 6379);
            // 设置验证码时效为五分钟
            jedis.setex(phoneNumber, 300, code);
            // 缓存登录时间、1小时登录、一分钟登录 次数
            jedis.set(phoneNumber + "_longing", new Date().getTime() + "");
            // 缓存登录一小时的 非连续相同验证码时添加 （在生成新验证码的时候使用）
            if (jedis.get(phoneNumber + "_oneHour") == null || jedis.get(phoneNumber + "_oneHour").equals("")) {
                jedis.set(phoneNumber + "_oneHour", "1");
            } else {
                jedis.setex(phoneNumber + "_oneHour", 3600, (Integer.parseInt(jedis.get(phoneNumber + "_oneHour")) + 1) + "");
            }
            // 缓存一分钟的 连续相同的验证码时添加（在登录的时候校验）
            //jedis.setex(phoneNumber+"_oneMin",60,(Integer.parseInt(jedis.get(phoneNumber+"_oneMin"))+1)+"");

            return ResponseData.success();
        }
        return ResponseData.fail("验证码发送失败，请重试");
    }

    @Override
    public ResponseData login(String phoneNumber, String code) {
        //    验证 是否在黑名单中   1 （对相同验证码进行黑名单生成）
        Jedis jedis = new Jedis("localhost", 6379);
//        设置一分钟内使用验证码登录的次数
        String oneMIN = jedis.get(phoneNumber + "_oneMIN");
        if (oneMIN == null || oneMIN.equals("")) {
            jedis.setex(phoneNumber + "_oneMIN", 60, "1");
        } else {//存在之前的登录操作
            jedis.set(phoneNumber + "_oneMIN", Integer.parseInt(oneMIN) + 1 + "");
        }
        oneMIN = jedis.get(phoneNumber + "_oneMIN");
//        判断一分钟黑名单
        if (Integer.parseInt(oneMIN) > 3) {
            return ResponseData.fail("一分钟后再试");
        }
//        判断是否在十分钟限制
        String oneHour = jedis.get(phoneNumber + "_oneHour");
        if (oneHour != null && Integer.parseInt(oneHour) > 3) {
            return ResponseData.fail("十分钟之后再试");
        }

//        验证手机号验证码是否正确
        // jedis.get(phoneNumber).toString().equals(code)
        if (code.equals(jedis.get(phoneNumber).toString())) {
            jedis.del(phoneNumber);
            jedis.del(phoneNumber + "_longing");
            jedis.del(phoneNumber + "_oneHour");
            jedis.del(phoneNumber + "_oneMIN");
//            验证码正确  判断是否为判断第一次登录  否进行注册
            int add = customerMapper.selectCustomerAdd(phoneNumber);
            if (add < 1) {
                customerMapper.insertCustomer(phoneNumber);
            }

            return ResponseData.success();

        }
        return ResponseData.fail("验证码输入不正确");
    }

//    @Override
//    public ResponseData findAll() {
//        List<Customer> customers = customerMapper.findAll();
//        return ResponseData.success(customers);
//    }

    @Override
    public ResponseData findAllByPage(int page, int limit, String phoneNumber) {
        // 开启分页 两个参数  1从第几页开始  2.展示几条  后一行必须跟查询语句
        PageHelper.startPage(page, limit);
//        执行查询语句
//        全查语句
//        List<Customer> customers = customerMapper.findAll();
//模糊查询
        List<Customer> customers = customerMapper.findAll(phoneNumber);
        PageInfo pageInfo = new PageInfo<>(customers);
        return ResponseData.success(pageInfo);
    }

    @Override
    public ResponseData deleteCustomer(int id) {
        int count = customerMapper.deleteOneById(id);
        if (count > 0) {
            return ResponseData.success();
        }
        return ResponseData.fail("删除失败，请重新操作!");
    }

    @Override
    public ResponseData update(Customer customer) {
//            if (customer.getGender().equals("男")){
//                customer.setGender("1");
//            }else {
//                customer.setGender("0");
//            }
        int count = customerMapper.update(customer);
        if (count == 1) {
            return ResponseData.success();
        }
        return ResponseData.fail("修改失败");
    }

    @Override
    public ResponseData updateShow(int id) {
        Customer customer = customerMapper.selectOneById(id);
        return ResponseData.success(customer);
    }


}


